import { HttpService } from '@nestjs/axios';
import { Injectable } from '@nestjs/common/decorators';
import { AxiosResponse } from 'axios';
import { map, Observable } from 'rxjs';
import { User } from 'src/entities/user.entity';
import { UserFromMDMDto } from 'src/modules/user/user-from-mdm.dto';
import {
  IUser,
  UserStatusCodes,
  UserType,
} from 'src/modules/user/user.interfaces';

@Injectable()
export class EmployeeService {
  constructor(private httpService: HttpService) {}

  employee(
    employeeId: string,
    accessToken: string,
  ): Observable<AxiosResponse<User>> {
    return this.httpService.get(
      `${process.env.MDM_URL_API}/hrm/employee/${employeeId}`,
      {
        headers: { authorization: `Bearer ${accessToken}` },
      },
    );
  }

  employees(accessToken: string): Observable<AxiosResponse<User[]>> {
    return this.httpService.get(`${process.env.MDM_URL_API}/hrm/employees`, {
      headers: { authorization: `Bearer ${accessToken}` },
    });
  }

  employeePhoto(
    employeeId: string,
    params: { photoSize?: 's' } = { photoSize: 's' },
  ): Observable<AxiosResponse<any>> {
    return this.httpService
      .get(`${process.env.MDM_URL_API}/hrm/employee/photo/${employeeId}`, {
        responseType: 'arraybuffer',
        params,
      })
      .pipe(
        map((res) => {
          return res.data;
        }),
      );
  }

  // hideEmployee = true для сотрудников с type = juridical с двумя учетками (virtual и juridical)
  setHideEmployeeForDoubleEntry(data = []): UserFromMDMDto[] {
    const prepareData: UserFromMDMDto[] = data.map((e, i, a) => {
      // Если есть дубли по email с разными type
      if (
        a
          .filter((_, ind) => i !== ind)
          .some((item) => item.email === e.email && item.type !== e.type)
      ) {
        // Скрываем сотрудника с типом JURIDICAL, если есть учетка VIRTUAL
        if (e.type === UserType.JURIDICAL) {
          e.hideEmployee = true;
        } else {
          // Если у сотрудника несколько учеток VIRTUAL
          // Если у учетки VIRTUAL статус DISMISSED
          if (e.status?.code === UserStatusCodes.DISMISSED) {
            e.hideEmployee = true;
          }
          // else {
          //   e.hideEmployee = false;
          // }
        }
        return e;
      } else if (e.status?.code === UserStatusCodes.DISMISSED) {
        //если дублей нет, проверка на уволенность
        e.hideEmployee = true;
        return e;
      } else return e; //если нет дублей и сотрудник не уволен
    });
    return prepareData;
  }

  // Выборка разницы в id сотрудников которые есть во внутренней БД, но не пришли из шины
  differenceEmployeeId(usersData: IUser[], currentUsers: IUser[]): IUser[] {
    const needHideEmployees: IUser[] = [];
    for (const user of currentUsers) {
      const matchUser = usersData.find((e: IUser) => e.id === user.id);
      if (!matchUser) needHideEmployees.push(user);
    }
    return needHideEmployees;
  }

  setHideEmployee(hideUsers: IUser[]): IUser[] {
    // скрываем всех сотрудников, не пришедших из шины
    const prepareUser = hideUsers.map((u) => {
      u.hideEmployee = true;
      return u;
    });
    return prepareUser;
  }
}
